package main

/*
管道支持for-range的方式进行遍历，有两个细节需要注意
在遍历时，如果管道没有关闭，则会出现deadlock的错误
在遍历时，如果管道已经关闭，则会正常遍历数据，遍历完后，就会退出遍历
*/
import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup
	wg.Add(1)
	msg5 := make(chan int) //实例化一个可读可写的无缓冲channel

	//通过goroutine进行接收数据
	go func(msg5 chan int) {
		defer wg.Done()
		//当发送的数据不是一个的时候，需要遍历接收数据，重复写取值太麻烦，用for range遍历
		for data := range msg5 {
			fmt.Println(data)
		}
	}(msg5)

	//发送数据
	msg5 <- 4
	msg5 <- 3
	msg5 <- 2

	//当遍历channel的时候，发送完成之后，一定要用要用close()关闭通道，通知到协程，防止阻塞死锁
	close(msg5)
	d := <-msg5
	fmt.Println("msg5关闭后继续读", d) //当channel关闭之后可以继续读，不可以在放里面写数据
	wg.Wait()

}
